summaryrefslogtreecommitdiffstats
path: root/src/hid_core/resources/abstracted_pad/abstract_properties_handler.h
blob: fa6827899829de6b180b6889933c5ce107f0a0d5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later

#pragma once

#include <span>

#include "common/common_types.h"
#include "core/hle/result.h"
#include "hid_core/hid_types.h"
#include "hid_core/resources/npad/npad_types.h"

namespace Service::HID {
struct NpadSharedMemoryEntry;

struct AppletResourceHolder;
class NpadAbstractedPadHolder;

struct ColorProperties {
    ColorAttribute attribute;
    Core::HID::NpadControllerColor color;
    INSERT_PADDING_BYTES(0x4);
};

/// Handles Npad request from HID interfaces
class NpadAbstractPropertiesHandler final {
public:
    explicit NpadAbstractPropertiesHandler();
    ~NpadAbstractPropertiesHandler();

    void SetAbstractPadHolder(NpadAbstractedPadHolder* holder);
    void SetAppletResource(AppletResourceHolder* applet_resource);
    void SetNpadId(Core::HID::NpadIdType npad_id);

    Core::HID::NpadIdType GetNpadId() const;

    Result IncrementRefCounter();
    Result DecrementRefCounter();

    Result ActivateNpadUnknown0x88(u64 aruid);

    void UpdateDeviceType();
    void UpdateDeviceColor();
    void UpdateFooterAttributes();
    void UpdateAllDeviceProperties();

    Core::HID::NpadInterfaceType GetFullkeyInterfaceType();
    Core::HID::NpadInterfaceType GetInterfaceType();

    Core::HID::NpadStyleSet GetStyleSet(u64 aruid);
    std::size_t GetAbstractedPadsWithStyleTag(std::span<IAbstractedPad*> list,
                                              Core::HID::NpadStyleTag style);
    std::size_t GetAbstractedPads(std::span<IAbstractedPad*> list);

    AppletFooterUiType GetAppletFooterUiType();

    AppletDetailedUiType GetAppletDetailedUiType();

    void UpdateDeviceProperties(u64 aruid, NpadSharedMemoryEntry& internal_state);

    Core::HID::NpadInterfaceType GetNpadInterfaceType();

    Result GetNpadFullKeyGripColor(Core::HID::NpadColor& main_color,
                                   Core::HID::NpadColor& sub_color) const;

    void GetNpadLeftRightInterfaceType(Core::HID::NpadInterfaceType& param_2,
                                       Core::HID::NpadInterfaceType& param_3) const;

private:
    AppletResourceHolder* applet_resource_holder{nullptr};
    NpadAbstractedPadHolder* abstract_pad_holder{nullptr};
    Core::HID::NpadIdType npad_id_type{Core::HID::NpadIdType::Invalid};
    s32 ref_counter{};
    Core::HID::DeviceIndex device_type{};
    AppletDetailedUiType applet_ui_type{};
    AppletFooterUiAttributes applet_ui_attributes{};
    bool is_vertical{};
    bool is_horizontal{};
    bool use_plus{};
    bool use_minus{};
    bool has_directional_buttons{};
    ColorProperties fullkey_color{};
    ColorProperties left_color{};
    ColorProperties right_color{};
};
} // namespace Service::HID